package com.ads.tpgrupo4.server.xml.mappers;

import sun.reflect.generics.reflectiveObjects.NotImplementedException;

import com.ads.tpgrupo4.domain.cpr.core.Rodamiento;
import com.ads.tpgrupo4.domain.cpr.cotizacion.Cotizacion;
import com.ads.tpgrupo4.domain.cpr.cotizacion.ItemCotizacion;
import com.ads.tpgrupo4.domain.cpr.cotizacion.ItemCotizacionDeRodamiento;
import com.ads.tpgrupo4.server.utils.DateUtils;
import com.ads.tpgrupo4.server.xml.StringBasedXmlSource;
import com.ads.tpgrupo4.server.xml.XmlSource;

public class CotizacionXmlMapper extends AbstractXmlMapper<Cotizacion> {

	private static CotizacionXmlMapper instance;
	
	public static CotizacionXmlMapper getInstance() {

		if (instance == null) {
			instance = new CotizacionXmlMapper();
		}
		
		return instance;
	}
	
	private CotizacionXmlMapper() {
	}
	
	@Override
	public XmlSource map(final Cotizacion cotizacion) {

		final StringBuilder sb = new StringBuilder();
		sb.append("<Cotizacion numero=\"nroCotizacion\">\r\n" + 
				" <Vigencia>\r\n" + 
				"  <Fecha>fechaCotizacion</Fecha>\r\n" + 
				"  <Termino>cantidadDias</Termino>\r\n" + 
				" </Vigencia>\r\n" + 
				"<Cliente>\r\n" + 
				"  <Cuil>cuilCliente</Cuil>\r\n" + 
				"  <RazonSocial>razonSocialCliente</RazonSocial>\r\n" + 
				"</Cliente>\r\n" + 
				"<Referencia>\r\n" + 
				"	  <SolicitudCotizacion>\r\n" + 
				"		<Numero>nroSolicitudOrigen</Numero>\r\n" + 
				"	    <Fecha>fechaSolicitudOrigen</Fecha>\r\n" + 
				"	  </SolicitudCotizacion>");
		
		sb.append("<Rodamientos>");
		for (final ItemCotizacion itemCot : cotizacion.getItems()) {
			
			final ItemCotizacionDeRodamiento item = (ItemCotizacionDeRodamiento) itemCot;
			
			String xmlItemCotizacion = "   <Item serie=\"nroDeSerie\"> \r\n" + 
					"<Sufijo>sufix</Sufijo>\r\n" + 
					"    <Marca>marcaFabricante</Marca>\r\n" + 
					"    <Origen>origenFabricacion</Origen>\r\n" + 
					"    <Precio>precioCotizado</Precio>\r\n" + 
					"    <Cantidad>cantidadUnidades</Cantidad>\r\n" + 
					"   </Item>";
			
			final Rodamiento rodamiento = item.getRodamiento();
			
			xmlItemCotizacion = xmlItemCotizacion.replace("nroDeSerie", rodamiento.getNumeroDeSerie());
			xmlItemCotizacion = xmlItemCotizacion.replace("sufix", rodamiento.getSufijo() != null ? rodamiento.getSufijo() : "");
			xmlItemCotizacion = xmlItemCotizacion.replace("marcaFabricante", rodamiento.getMarca());
			xmlItemCotizacion = xmlItemCotizacion.replace("origenFabricacion", rodamiento.getOrigen());
			xmlItemCotizacion = xmlItemCotizacion.replace("precioCotizado", String.valueOf(item.getPrecioCotizado()));
			xmlItemCotizacion = xmlItemCotizacion.replace("cantidadUnidades", item.getCantidadCotizada().toString());
			
			sb.append(xmlItemCotizacion);
		}
		sb.append("</Rodamientos>");
		
		sb.append(" </Referencia>\r\n" + 
				"</Cotizacion>");

		String xml = sb.toString();
		xml = xml.replace("nroCotizacion", cotizacion.getNumero().toString());
		xml = xml.replace("fechaCotizacion", DateUtils.toXmlDateTimeString(cotizacion.getFecha()));
		xml = xml.replace("cantidadDias", String.valueOf(cotizacion.getVigencia().getTermino()));
		xml = xml.replace("cuilCliente", cotizacion.getCliente() != null ? cotizacion.getCliente().getCuil() : "");
		xml = xml.replace("razonSocialCliente", cotizacion.getCliente() != null ? cotizacion.getCliente().getRazonSocial() : "");
		xml = xml.replace("nroSolicitudOrigen", cotizacion.getSolicitudOrigen().getNumero().toString());
		xml = xml.replace("fechaSolicitudOrigen", DateUtils.toXmlDateTimeString(cotizacion.getSolicitudOrigen().getFecha()));
		
		return new StringBasedXmlSource(xml);
	}
	
	@Override
	protected Cotizacion doMap(final XmlSource source) throws Exception {
		throw new NotImplementedException();
	}

}
